この章のテーマ §
partialクラス(partial型)とpartialメソッドについて学びます。これらは定義を分割する手段ですが、機能的には全く違う効能を持ちます。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, クラスの基礎、メソッドの基礎
解説 §
partialキーワードを付けたクラスなどの型は、定義を複数に分割できます。つまり、同じ名前のクラスの定義が複数あっても良く、それらは全て足し合わさされて1つの定義として扱われます。つまり、privateとして宣言されたメソッドは、サンプルソースのように、他の定義からでも呼び出せます。
一方で、partialキーワードを付けたメソッドはpartialメソッドとなり、定義の分割とは違う効能を発揮します。名前、戻り値の型、引数の宣言だけを書いた部分と、実行する文まで記述した完全な形の実装の2つを分けて記述できますが、実装は省略できます。実装がないとしても呼び出しを行うコードは記述可能で実行できます。ただ単に何も呼び出さないだけです。これはツールで自動生成したコードに、必要な実装だけ主導で追加する場合に便利な機能です。
罠の数々 §
- partialクラス(partial型)は単に定義を分割可能にしているだけで、最終的に全て1つの型になる。同じ名前の別の型を宣言しているわけではない
- partualクラスは割と古い機能で、WinFormアプリを開発するとすぐにでも目にする可能性がある
- 一方で、partialメソッドはかなり新しい機能なので、利用例はなかなか見かけない。しかし、今後は活用されていくかもしれない。頭の片隅に入れておこう
参考リンク §
partial 型 (C# リファレンス)
partial メソッド (C# リファレンス)
部分クラスと部分メソッド (C# プログラミング ガイド)
サンプルソース: kw_partial §
var x = new A();
x.PublicSub();
partial class A
{
private void privateSub()
{
Console.WriteLine("A.privateSub");
}
partial void PartialMethodA();
partial void PartialMethodB();
}
partial class A
{
public void PublicSub()
{
Console.WriteLine("A.PublicSub");
privateSub();
PartialMethodA();
PartialMethodB();
}
partial void PartialMethodA()
{
Console.WriteLine("A.PartialMethodA");
}
}
実行結果 §
A.PublicSub
A.privateSub
A.PartialMethodA
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。
var x = new A();
Console.WriteLine(x.PartialMethodA());
partial class A
{
public partial int PartialMethodA();
}
- 0
- null
- default
- コンパイルエラー
- 実行時例外
[[解答]]